package cn.tedu.truetaste.service.impl;

import cn.tedu.truetaste.ex.ServiceException;
import cn.tedu.truetaste.mapper.StoreMapper;
import cn.tedu.truetaste.pojo.dto.StoreAddNewDTO;
import cn.tedu.truetaste.pojo.dto.StoreUpdateDTO;
import cn.tedu.truetaste.pojo.entity.Store;
import cn.tedu.truetaste.pojo.vo.StoreListItemVO;
import cn.tedu.truetaste.pojo.vo.StoreStandardVO;
import cn.tedu.truetaste.service.IStoreService;
import cn.tedu.truetaste.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Slf4j
@Service
public class StoreServiceImpl implements IStoreService {
    @Autowired
    private StoreMapper storeMapper;

    public StoreServiceImpl() {
        log.info("创建业务对象：StoreServiceImpl");
    }

    @Override
    public void addNew(StoreAddNewDTO storeAddNewDTO) {
        log.debug("开始处理【添加店铺】的业务，参数：{}", storeAddNewDTO);
        String  name = storeAddNewDTO.getName();
        int countByName= storeMapper.countByName(name);
        // 判断所属菜品名称是否存在
        if (countByName>0) {
            // 是：菜品名称不存在，抛出RuntimeException异常
            String message = "添加店铺失败！店铺已经被占用！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        Store store = new Store();
        BeanUtils.copyProperties(storeAddNewDTO, store);

        // 执行插入数据
        int rows = storeMapper.insert(store);
        if (rows != 1) {
            String message = "添加店铺失败！服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_INSERT, message);
        }
    }

    @Override
    public void delete(Long id) {
        log.debug("开始处理【删除店铺】的业务，参数：{}", id);
        // 检查尝试删除的店铺是否存在
        Object queryResult = storeMapper.getStandardById(id);
        if (queryResult == null) {
            String message = "删除店铺失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        // 执行删除
        int rows = storeMapper.deleteById(id);
        if (rows != 1) {
            String message = "删除店铺失败，服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_DELETE, message);
        }
        log.debug("删除完成！");
    }

    @Override
    public void updateInfoById(Long id, StoreUpdateDTO storeUpdateDTO) {
        log.debug("开始处理【修改店铺详情】的业务，参数ID：{}，新数据：{}",id, storeUpdateDTO);

        {
            // 调用Mapper的getStandardById()执行查询，检查数据是否不存在
            StoreStandardVO stores = storeMapper.getStandardById(id);
            // 是：数据不存在，抛出异常
            if (stores == null) {
                String message = "修改店铺详情失败，尝试访问的数据不存在！";
                log.warn(message);
                throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
            }
        }

        {
            // 调用Mapper的countByNameAndNotId()执行查询，检查新的名称是否已经被别的数据占用
            int count = storeMapper.countByNameAndNotId(id, storeUpdateDTO.getName());
            // 是：名称被别的数据占用，抛出异常（NOT_CONFLICT）
            if (count > 0) {
                String message = "修改店铺详情失败，新的菜品名称已经被占用！";
                log.warn(message);
                throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
            }
        }

        // 创建Store对象
        Store store = new Store();
        // 将参数对象的属性值复制到以上新创建的Store对象中
        BeanUtils.copyProperties(storeUpdateDTO, store);
        store.setId(id);
        // 调用Mapper的update(Store store)方法执行修改
        log.debug("即将执行修改数据，参数：{}", store);
        int rows = storeMapper.update(store);
        if (rows != 1) {
            String message = "修改店铺详情失败，服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE, message);
        }
    }

    @Override
    public StoreStandardVO getStandardById(Long id) {
            log.debug("开始处理【根据id查询店铺详情】的业务，参数：{}", id);

            // 调用Mapper的getStandardById()执行查询
            StoreStandardVO store = storeMapper.getStandardById(id);
            // 判断查询结果是否为null
            // 是：没有匹配的数据，抛出异常（NOT_FOUND）
            if (store == null) {
                String message = "查询店铺详情失败，尝试访问的数据不存在！";
                log.warn(message);
                throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
            }

            log.debug("即将返回查询结果：{}", store);
            return store;
    }

    @Override
    public List<StoreListItemVO> list() {
        log.debug("开始处理【查询店铺列表】的业务，无参数");
        List<StoreListItemVO> list = storeMapper.list();
        log.debug("即将返回查询结果：{}", list);
        return list;
    }
}
